#include "ota_http.h"
#include "log/log.h"
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/**
 * 接收响应数据的回调函数
 * ptr: 指向响应数据的指针
 * size: 每个数据块的大小
 * nmemb: 数据块的数量
 * 
 */
size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    char *json_buf = (char *)userdata; 
    // 数据长度
    int data_len = size * nmemb;
    // 将数据写入容器
    memcpy(json_buf, ptr, data_len);
    // 写一个\0
    json_buf[data_len] = '\0';

    // 返回接收数据长度
    return data_len;
}

/**
 * 请求获取得到json数据
 */
char *ota_http_getJSON(char *url)
{
    // 初始化CURL
    CURL *curl = curl_easy_init();
    // 指定url
    curl_easy_setopt(curl, CURLOPT_URL, url);  // option
    // 指定接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    // 指定接收响应数据的容器，传递给回调函数， 一旦收到数据，将数据写入容器
    char *json_buf = malloc(1024); // 假定json数据不超过1024字节
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json_buf);
    // 执行请求， 如果失败， 返回NULL
    CURLcode res = curl_easy_perform(curl);
    // 如果失败， 释放资源，返回NULL
    if (res != CURLE_OK) {
        log_error("ota_http_getJSON failed: %s", curl_easy_strerror(res));
        free(json_buf);
        curl_easy_cleanup(curl);
        return NULL;
    }
    // 请求成功，释放资源
    curl_easy_cleanup(curl);
    // 返回容器中的数据
    return json_buf;
}

/**
 * 下载文件
 */
int ota_http_download(char *url, char *filename)
{
    // 初始化CURL
    CURL *curl = curl_easy_init();
    // 指定url
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 指定得到返回的文件的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    // 指定得到返回的文件的回调函数的参数，即文件指针
    FILE *file = fopen(filename, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    // 执行请求
    CURLcode res = curl_easy_perform(curl);
    // 如果请求失败，释放资源，返回-1
    if (res != CURLE_OK) {
        log_error("ota_http_download failed: %s", curl_easy_strerror(res));
        fclose(file);
        curl_easy_cleanup(curl);
        return -1;
    }
    // 请求成功，释放资源
    fclose(file);
    curl_easy_cleanup(curl);
    return 0;
}
